/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.inventario.rn;

import isd.inventario.dao.StockDAO;
import isd.inventario.modelo.ST_ItemMovimiento;
import isd.inventario.modelo.ST_Producto;
import isd.inventario.modelo.ST_Sector;
import isd.inventario.modelo.ST_Stock;
import isd.inventario.modelo.StockPK;
import isd.inventario.vistas.ST_StockProductoDeposito;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Claudio
 */
@Stateless
public class StockRN implements Serializable {

    @EJB private StockDAO stockDAO;

    public synchronized void guardar(ST_Stock stock) throws Exception{
        
        ST_Stock stockAux = getStock(stock);
             
        if(stockAux==null){
            stockDAO.crear(stock);
        }else{
           stockAux.setStocks(stockAux.getStocks().add(stock.getStocks()));
           stockDAO.editar(stockAux);
        }
    }

    public ST_Stock nuevoStock(ST_ItemMovimiento i){

        ST_Stock s = new ST_Stock(i);

        if(i.getProducto().getDefineSerie().equals("N")){
            s.setNserie("");
        }
        return s;
    }

    public ST_Stock getStock(ST_Stock stock){

        StockPK idPK = new StockPK(stock.getTippro(), stock.getArtcod(), stock.getNserie(), stock.getEnvase(), stock.getNdespa(), stock.getNotros(), stock.getNfecha(), stock.getNatrib(), stock.getNubica(), stock.getNestan(), stock.getDeposi(), stock.getSector());
        return stockDAO.getObjeto(ST_Stock.class, idPK);
    }

    public boolean isProductoDisponible(ST_Stock s){

        BigDecimal disp = stockDAO.getDisponibleProducto(s);
        BigDecimal cant = s.getStocks().add(BigDecimal.ZERO);

        if(disp==null){
//            System.out.println("Producto sin stock en "+ s.getDeposi());
            return false;
        }

        //System.err.println("Producto:" + s + "Cantidad: " + cant  + " Disp:" + disp );

        if(cant.compareTo(BigDecimal.ZERO)>0){
            //System.err.println("El stock positivo: " + cant);
            cant = cant.negate();
        }

//        System.err.println("Stock resultante: " +disp.add(cant));

        //Si el stock resultante es menor a cero no pasa
        if(disp.add(cant).compareTo(BigDecimal.ZERO)==-1){
            return false;
        }

        return true;
    }

    public ST_Stock getStock(StockPK idPK){

        return stockDAO.getObjeto(ST_Stock.class, idPK);
    }

    public List<ST_StockProductoDeposito> verStockPorProducto(ST_Producto p) {

        return stockDAO.verStockPorProducto(p);
    }

    public List<ST_StockProductoDeposito> verStockPorDeposito(ST_Sector s) {

        return stockDAO.verStockPorDeposito(s);
    }

    public List<ST_Stock> getStockByProductoDeposito(ST_Producto p,ST_Sector s){
        return stockDAO.getStockByProductoDeposito(p, s);
    }

    public BigDecimal getStockAFecha(ST_Producto p,ST_Sector s, Date fecha){
        return stockDAO.getStockAFecha(p,s,fecha);
    }

    public List<ST_ItemMovimiento> getMovimientosEntreFechas(ST_Producto p,ST_Sector s, Date fDesde,Date fHasta){

        return stockDAO.getMovimientosEntreFechas(p,s,fDesde,fHasta);
    }
}
